/*******************************************************************************
 * Copyright (c) 2010, 2030 www.itlaobing.cn
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 *******************************************************************************/
package IMG1;

/* 
 * @(#)ImageUtils.java
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Library General Public License for more details.
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */

import java.awt.Image;
import java.awt.image.PixelGrabber;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Mainipulation of image data.
 * @author 88250
 * @version 1.0.0.3, Mar 20, 2008
 */
public class ImageUtils {

    /**
     * Return all of the pixel values of sepecified <code>image</code>.
     * @param image the sepecified image
     * @param width width of the <code>image</code>
     * @param height height of the <code>image</code>
     * @return
     */
    public static int[] getPixels(Image image, int width, int height) {
        int[] pixels = new int[width * height];
        try {
            new PixelGrabber(image, 0, 0, width, height, pixels, 0, width).grabPixels();
        } catch (InterruptedException ex) {
            Logger.getLogger(ImageUtils.class.getName()).
                    log(Level.SEVERE, null, ex);
        }
        return pixels;
    }

    /**
     * Get a matrix that described the <code>pixels</code>.
     * <p>
     * For example, the result of the matrix like this:
     * <center>
     * 0000000000000000<br>
     * 0000000000000000<br>
     * 0001111111110000<br>
     * 0011111111111000<br>
     * 0011111111111100<br>
     * 0011000000011100<br>
     * 0000000000011100<br>
     * 0000111111111100<br>
     * 0011111111111100<br>
     * 0011111110011100<br>
     * 0111100000011100<br>
     * 0111100000011100<br>
     * 0111100000111100<br>
     * 0111100001111110<br>
     * 0011111111111100<br>
     * 0011111111111100<br>
     * 0001111111111100<br>
     * 0000000000000000<br>
     * 0000000000000000<br>
     * </center>
     * it describes the alphbet 'a'.
     * </p>
     * @param pixels the pixel array
     * @param sparseFactor sparse factor
     * @return a matrix that describes a alphbet
     */
    public static int[][] getSymbolMatrix(int[] pixels, int sparseFactor) {
        final int width = StdModelRepository.width;
        final int height = StdModelRepository.height;
        int[][] ret = new int[width][height];

        for (int i = 0; i < height; i++) {
            for (int j = 0; j < width; j++) {
                if (pixels[i * width + j] == -1) {
                    ret[j][i] = 0;
                } else {
                    ret[j][i] = 1;
                }
            }
        }

        return ret;
    }

    /**
     * Print the <code>matrix</code> under console.
     * @param matrix the sepecified matrix data
     */
    public static void displayMatrix(int[][] matrix) {
        System.out.println(" ");

        for (int i = 0; i < matrix[0].length; i++) {
            for (int j = 0; j < matrix.length; j++) {
                if (matrix[j][i] != 0) {
                    System.out.print("*");
                } else {
                    System.out.print(" ");
                }
            }
            System.out.println();
        }
    }
}